#pragma once
#ifndef _FEM_TRIANGLE_NET_
#define _FEM_TRIANGLE_NET_

//================================================================================================================================
//================================================================================================================================
// QtCore
#include <QtCore/QList>
// Локальные
#include "geometry/2d/point.h"
#include "fem/triangleelement.h"
#include "core_global.h"

//================================================================================================================================
//================================================================================================================================
namespace fem
{
    /// Треугольная конечноэлементная сетка.
    /// \sa Метод конечных элементов для решения скалярных и векторных задач : учеб. пособие / Ю.Г. Соловейчик, М.Э. Рояк,
    /// М.Г. Персова - Новосибирск: Изд-во НГТУ, 2007. - С. 468-472.
    class CORE_EXPORT TriangleNet
    {
    public:
        /// Создание пустой конечноэлементной сетки.
        TriangleNet() : m_nvtr(), m_points() {}

        /// Создание сетки на основе информации из файлов \e points_filename и \e nvtr_filename.
        TriangleNet(const QString &points_filename, const QString &nvtr_filename);

        /// Создание конечноэлементной сетки с заданной структурой.
        TriangleNet(const QList<TriangleElement> &nvtr, const QList<geometry::_2d::Point> &points) : m_nvtr(nvtr), m_points(points) {}

        /// Получение числа узлов расчётной области.
        int numOfPoints() const {return m_points.size();}
        /// Получение числа конечных элементов в сетке.
        int numOfElements() const {return m_nvtr.size();}

        /// Получение индекса материала, соответствующего конечному элементу \e element.
        int material(int element) const {return m_nvtr[element].material();}
        /// Получение глобального индекса указанной вершины конечного элемента \e element.
        int pointIndex(int element, int index) const {return m_nvtr[element].point(index);}
        /// Получить координаты указанного узла сетки.
        const geometry::_2d::Point& point(int index) const {return m_points[index];}
        /// Получить координаты указанной вершины конечного элемента \e element.
        const geometry::_2d::Point& point(int element, int index) const {return m_points[m_nvtr[element].point(index)];}

        /// Запись информации о сетке в файлы \e points_filename и \e nvtr_filename.
        void writeToFiles(const QString &points_filename, const QString &nvtr_filename) const;

        /// Считывание информации о сетке из файлов \e points_filename и \e nvtr_filename.
        void readFromFiles(const QString &points_filename, const QString &nvtr_filename);

    private:
        QList<TriangleElement> m_nvtr;          ///< Информация о структуре сетки.
        QList<geometry::_2d::Point> m_points;   ///< Координаты узлов сетки.
    };
}

#endif // _FEM_TRIANGLE_NET_
